// 测试 map 、flat 、flatMap 方法

const numbers = [ 1 , 2 , 3 , 4 , 5 ];

// Array.prototype.map( callback( currentValue [ , index [ , array ] ] ) [ , thisArg ] )
// 创建一个新数组，其结果是该数组中的每个元素是调用一次提供的函数后的返回值
const squares = numbers.map( n => n ** 2 );
console.log( '源数组: ' , numbers );
console.log( '平方: ' , squares );

const messages = [ 'hello kaifamiao' , 'how to program Java' , 'good good study' ];
console.log( messages );
const results = messages.map( s => s.split( ' ' ) );
console.log( results );

console.log( '- '.repeat( 30 ) );

// Array.prototype.flat( [depth] )
// 会按照一个可指定的深度递归遍历数组，并将所有元素与遍历到的子数组中的元素合并为一个新数组返回
// 参数 depth 指定要提取嵌套数组的结构深度，默认值为 1
const words = results.flat();
console.log( words );

let integers = [ 
    [
        [
            [ 41 ] , 
            302 
        ],
        [ 313 ] , 
        211 
    ] ,
    [ 21 ] ,
    101 
];

console.log( integers );
console.log( integers.flat() );
console.log( integers.flat(1) );
console.log( integers.flat(2) );

console.log( '- '.repeat( 30 ) );

const names = [ 'ge bi lao wang' , 'zan jia lao li' ];
// console.log( names.map( s => s.split( ' ' ) ).flat() );

// Array.prototype.flatMap( callback( currentValue [ , index [ , array] ] ) [ , thisArg ] )
// 首先使用映射函数映射每个元素，然后将结果压缩成一个新数组
// 它与 map 连着深度值为1的 flat 几乎相同，但 flatMap 通常在合并成一种方法的效率稍微高一些
console.log( names.flatMap( s => s.split( ' ' ) ));